{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "ab3ff61d-ae04-48d4-b0ea-325281390a77",
   "metadata": {},
   "source": [
    "# QSVM\n",
    "Quantum Support Vector Machines is the Quantum version of SVM - a data classification method which separates the data using a hyperplane.\n",
    "\n",
    "This algorithm takes the following steps:\n",
    "- Map the data into a different hyperspace (since the data may be non-linearly-seperable in the original space)\n",
    "    - In the case of QSVM - mapping the classical data into Hilbert space.\n",
    "- Calculate the kernel matrix\n",
    "    - The kernel entries are the fidelities between different feature vectors\n",
    "    - In the case of QSVM - this is done on a Quantum computer.\n",
    "- Optimize the dual problem (this is always done classicaly)\n",
    "$$ L_D(\\alpha) = \\sum_{i=1}^t \\alpha_i - \\frac{1}{2} \\sum_{i,j=1}^t y_i y_j \\alpha_i \\alpha_j K(\\vec{x}_i \\vec{x}_j) $$\n",
    "    - Where $t$ is the amount of data points\n",
    "    - the $\\vec{x}_i$s are the data points\n",
    "    - $y_i$ is the label $\\in \\{-1,1\\}$ of each data point\n",
    "    - $K(\\vec{x}_i \\vec{x}_j)$ is the kernel matrix element between the $i$ and $j$ datapoints\n",
    "    - and we optimize over the $\\alpha$s\n",
    "    - We expect most of the $\\alpha$s to be $0$. The $\\vec{x}_i$s that correspond to non-zero $\\alpha_i$ are called the Support Vectors.\n",
    "- Finally, we may predict unlabeled data by calculating the kernel matrix of the new datum with respect to the support vectors\n",
    "$$ \\text{Predicted Label}(\\vec{s}) = \\text{sign} \\left( \\sum_{i=1}^t y_i \\alpha_i^* K(\\vec{x}_i , \\vec{s}) + b \\right) $$\n",
    "    - Where $\\vec{s}$ is the datapoint to be classified\n",
    "    - $\\alpha_i^*$ are the optimized $\\alpha$s\n",
    "    - And $b$ is the bias.\n",
    "\n",
    "\n",
    "Reference:\n",
    "\n",
    "[1] Havl&#237;&#269;ek, V., C&#243;rcoles, A.D., Temme, K. et al. Supervised learning with quantum-enhanced feature spaces. Nature 567, 209-212 (2019). https://doi.org/10.1038/s41586-019-0980-2"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fbbcced5-c83b-4cd7-be25-2055f1da451a",
   "metadata": {},
   "source": [
    "# Code\n",
    "First, we start with the relevant imports"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "9e4a4ce2-594c-471f-8e07-37104cc94cb5",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-05-07T14:52:55.548189Z",
     "iopub.status.busy": "2024-05-07T14:52:55.547704Z",
     "iopub.status.idle": "2024-05-07T14:52:58.483150Z",
     "shell.execute_reply": "2024-05-07T14:52:58.482508Z"
    }
   },
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "\n",
    "from classiq import construct_qsvm_model, execute, show, synthesize\n",
    "from classiq.applications.qsvm import QSVMFeatureMapEntanglement\n",
    "\n",
    "## Classiq imports"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "419ac43f-6239-4bcb-93d9-983080ec41f8",
   "metadata": {},
   "source": [
    "Next, we generate data.\n",
    "\n",
    "In this example, we take a 2D input space, and a binary classification (i.e. only 2 groups of data points)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "2d262beb-d345-4249-81d7-c20c44320031",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-05-07T14:52:58.486112Z",
     "iopub.status.busy": "2024-05-07T14:52:58.485591Z",
     "iopub.status.idle": "2024-05-07T14:52:58.489057Z",
     "shell.execute_reply": "2024-05-07T14:52:58.488476Z"
    }
   },
   "outputs": [],
   "source": [
    "import random\n",
    "\n",
    "RANDOM_SEED = 0\n",
    "random.seed(RANDOM_SEED)\n",
    "np.random.seed(RANDOM_SEED)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "36b8fb34-a659-4829-b6b9-fe2a77536ad5",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-05-07T14:52:58.491385Z",
     "iopub.status.busy": "2024-05-07T14:52:58.491025Z",
     "iopub.status.idle": "2024-05-07T14:52:58.495333Z",
     "shell.execute_reply": "2024-05-07T14:52:58.494745Z"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "# Importing functions used for this demo, to generate random linearly separable data\n",
    "from classiq.applications.qsvm.qsvm_data_generation import (\n",
    "    data_and_labels_to_data_dict,\n",
    "    data_dict_to_data_and_labels,\n",
    "    generate_data,\n",
    ")\n",
    "\n",
    "# Generate sample data:\n",
    "sources = np.array([[1.23016026, 1.72327701], [3.20331931, 5.32365722]])\n",
    "\n",
    "training_input: dict = generate_data(sources=sources)\n",
    "test_input: dict = generate_data(sources=sources)\n",
    "predict_input, predict_real_labels = data_dict_to_data_and_labels(\n",
    "    generate_data(sources=sources)\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "564b0996-8dd2-4bea-b367-4e569ecab5ae",
   "metadata": {},
   "source": [
    "Plotting the data.\n",
    "\n",
    "Note that the data is expected to be normalized to within $ 0 $ to $ 2 \\pi $."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "14bb8caa-e580-4029-a061-39e21f89626d",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-05-07T14:52:58.497467Z",
     "iopub.status.busy": "2024-05-07T14:52:58.497297Z",
     "iopub.status.idle": "2024-05-07T14:52:59.107522Z",
     "shell.execute_reply": "2024-05-07T14:52:59.106757Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhYAAAGzCAYAAABzfl4TAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuNSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/xnp5ZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAwDklEQVR4nO3df3RU9Z3/8ddkIAlIMkAAk5QYEK0SI8gPwwGKIoLCF7Hqd1ERaqSu3VIQIWvXL7v9Glh3DdbWRXowKlWoRVRKi4AtoQqCdoUi5GQL5lsVDD+qgSjgJASZYOZ+/0gnMiQhM5N7586deT7OmZPOzZ2575mq95XPT5dhGIYAAABMkGR3AQAAIH4QLAAAgGkIFgAAwDQECwAAYBqCBQAAMA3BAgAAmIZgAQAATEOwAAAApiFYAAAA0xAsgDjWr18/3XfffRG9duzYsRo7dqyp9XSUy+XSwoUL7S4DwAUQLAAbvffee1q4cKG+/PJLu0uJa5WVlVq4cKEOHjxodylA3OtkdwFAInvvvfe0aNEi3Xffferevbvp7//hhx8qKSmyvx/++Mc/mlyNfSorK7Vo0SKNHTtW/fr1s7scIK4RLACH8Pv9amhoUGpqasivSUlJifh6ycnJEb8WQOKiKwSwycKFC/XjH/9YktS/f3+5XC65XK7m5nqXy6U5c+bo5Zdf1lVXXaWUlBSVlZVJkn72s59p1KhRysjIUJcuXTRs2DCtXbu2xTXOH2OxcuVKuVwu/fd//7eKiorUu3dvXXTRRbr99tv1+eefB732/DEW27Ztk8vl0po1a/Sf//mf6tu3r1JTU3XjjTdq//79La69bNkyXXrpperSpYsKCgr07rvvhjxuw+fzaf78+erdu7fS0tJ066236m9/+1uL8w4dOqQf/ehHuuKKK9SlSxdlZGRo6tSpQV0eK1eu1NSpUyVJN9xwQ/P3vG3bNknS+vXrNXnyZGVnZyslJUUDBgzQY489psbGxnbrBNASLRaATe644w599NFHeuWVV/Rf//Vf6tWrlySpd+/ezeds3bpVa9as0Zw5c9SrV6/mZvynn35at956q6ZPn66Ghga9+uqrmjp1qt544w1Nnjy53Ws/+OCD6tGjh4qLi3Xw4EEtWbJEc+bM0WuvvdbuaxcvXqykpCQ9/PDD8nq9+ulPf6rp06frz3/+c/M5paWlmjNnjsaMGaP58+fr4MGDuu2229SjRw/17du33Wv84z/+o1atWqV77rlHo0aN0tatW1v9XO+//77ee+893X333erbt68OHjyo0tJSjR07VpWVleratauuu+46zZ07V0uXLtW//uu/auDAgZLU/HPlypXq1q2bioqK1K1bN23dulWPPvqoamtr9eSTT7ZbK4DzGABs8+STTxqSjKqqqha/k2QkJSUZH3zwQYvfnT59Ouh5Q0ODkZ+fb4wbNy7oeG5urlFYWNj8fMWKFYYkY/z48Ybf728+Pn/+fMPtdhtffvll87Hrr7/euP7665ufv/3224YkY+DAgYbP52s+/vTTTxuSjL179xqGYRg+n8/IyMgwrr32WuPs2bPN561cudKQFPSeramoqDAkGT/60Y+Cjt9zzz2GJKO4uLjN78EwDGPHjh2GJOOll15qPvab3/zGkGS8/fbbLc5v7T3+6Z/+yejatatx5syZC9YKoCW6QoAYdv311ysvL6/F8S5dujT/75MnT8rr9WrMmDEqLy8P6X1/8IMfyOVyNT8fM2aMGhsbdejQoXZfO3PmzKDxF2PGjJEkffLJJ5Kk3bt36/jx43rggQfUqdM3jaLTp09Xjx492n3/P/zhD5KkuXPnBh2fN29ei3PP/R7Onj2r48eP67LLLlP37t1D/i7OfY+6ujp98cUXGjNmjE6fPq2//vWvIb0HgG/QFQLEsP79+7d6/I033tB//Md/qKKiQj6fr/n4uWHhQi655JKg54Eb/smTJzv82kA4ueyyy4LO69SpU0gzMg4dOqSkpCQNGDAg6PgVV1zR4tyvvvpKJSUlWrFihT799FMZhtH8O6/X2+61JOmDDz7QT37yE23dulW1tbVBvwv1PQB8g2ABxLBz/5oOePfdd3Xrrbfquuuu0zPPPKOsrCx17txZK1as0OrVq0N6X7fb3erxc2/MVrzWbA8++KBWrFihefPmaeTIkfJ4PHK5XLr77rvl9/vbff2XX36p66+/Xunp6fr3f/93DRgwQKmpqSovL9cjjzwS0nsACEawAGwUagvDuX77298qNTVVmzdvDppOumLFCjNLi1hubq4kaf/+/brhhhuaj3/99dc6ePCgBg0a1O7r/X6/Dhw4ENRK8eGHH7Y4d+3atSosLNTPf/7z5mNnzpxpseBYW9/ztm3bdPz4cf3ud7/Tdddd13y8qqrqgjUC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1NRUu8txlEmTJjX/70GDBmnEiBHKzc3VmjVrdP/999tYWezz+/0aPny4Hn/8cUnSkCFDtG/fPj377LMqLCyMai1RabHo1auX3G63jh07FnT82LFjyszMjEYJSGBz5szRG2+8obffflt9+/a1uxzHSE5O1mWXXaZhw4appKREgwcP1tNPP213WTFvz549qqmp0dChQ9WpUyd16tRJ27dv19KlS9WpUyc1NjbaXaJjdO/eXd/+9re1f/9+u0uJeVlZWS1C/8CBA23pSopKsEhOTtawYcO0ZcuW5mN+v19btmyhzxaWMQxDc+bM0bp167R161b179/f7pIcze/3y+fz2V1GzLvxxhu1d+9eVVRUND+GDx+u6dOnq6KiQm632+4SHePUqVM6cOCAsrKy7C4l5o0ePbrFdPqPPvpIubm5Ua8lal0hRUVFKiws1PDhw1VQUKAlS5aovr5eM2fOjFYJjnXq1KmgxF5VVaWKigr17NlTl1xyiY2VxbbZs2dr9erVWr9+vdLS0prH83g8HnXp0sXm6mLbggULNGnSJF1yySWqq6vT6tWrtW3bNm3evNnu0mJeWlpai3E8F110kTIyMhjf046HH35YU6ZMUW5urj777DMVFxfL7XZr2rRpdpcW8+bPn69Ro0bp8ccf15133qldu3bp+eef1/PPPx/9YqI5BeUXv/iFcckllxjJyclGQUGBsXPnzmhe3rHefvttQ1KLR2Fhod2lxbTWvjNJxooVK+wuLeZ9//vfN3Jzc43k5GSjd+/exo033mj88Y9/tLssx2K6aWjuuusuIysry0hOTja+9a1vGXfddZexf/9+u8tyjI0bNxr5+flGSkqKceWVVxrPP/+8LXW4DMMwoh9nAABAPGKvEAAAYBqCBQAAMA3BAgAAmIZgAQAATEOwAAAApiFYAAAA0xAsAACAaQgWAADANAQLAABgGoIFAAAwDcECAACY5v8DDz8fzAipK4EAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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BVOP97f8c1/HGKPnnnuuyXOmpaVJUpMakpOT5XA4/EYS/va3vwW8mdewYcN0/PjxJmshvMP8n3zyie+at+XWKsH8/F4vvvii370vvvii2rdvr5EjR0pq7EJyu9369a9/3eSxZ8+ebfXvcOLEidq/f79effXVJn926tQp1dfXS/r/f7vPP/+83z1z585t8bkrKys1fPjwFv8cCDdGLBA3qqurNWHCBI0dO1YbNmzwtegNHDiwzcc+88wzWrNmjYYOHaoHH3xQBQUFOnbsmCorK7Vq1SodO3ZMkvTggw/qxRdf1L333qstW7YoJydHb7zxhjp16tTma9x888366U9/queff147d+7U2LFj5fF4tH79et18882+xYKFhYVatWqV5syZox49eqh3794aOnRos88ZaD19+/ZVfn6+nnjiCe3fv18ZGRlaunRps1MThYWFkhoXDN56661KTk7WT37yE40fP15z5szR2LFjdc8996i2tlYvvfSS+vTpo//5n/9p8+cfP3682rVrp1WrVvktLh0zZox69uypqVOn6l/+5V+UnJys1157TVlZWdq7d2+bzxuIYH5+qXEXy4qKChUXF2vo0KFasWKFPvzwQ/3iF7/wTXHceOONevjhh1VeXq6tW7dqzJgxat++vXbu3Km3335bzz33nN+i2nP99Kc/1VtvvaVHHnlEa9as0YgRI+R2u7Vjxw699dZbWrlypQYPHqyrr75ad999t373u9/J5XJp+PDh+vjjj7Vr165mn3fLli06duyYbrvtNkveNyAkkW9EAazlbVfcvn27ueOOO0x6errp3LmzmT59ujl16pTfvZJMSUlJs89z6NAhU1JSYnJzc0379u1Ndna2GTlypJk/f77ffXv27DETJkwwnTp1Ml27djUzZ870tRi21m5qjDFnz541zz77rOnbt6/p0KGDycrKMuPGjTNbtmzx3bNjxw5zww03mI4dOxpJbbaeBlrP9u3bzahRo8xFF11kunbtah588EHzxRdfGElmwYIFfjU++uijJisryzgcDr9W0D/84Q/msssuMykpKaZv375mwYIFLbaLNmfChAlm5MiRTa5v2bLFDB061HTo0MH07NnTzJkzp8V20/Hjxzd5/PntnM21mwb68xcXF5u0tDSze/duM2bMGNOpUyfTvXt3U1paatxud5PXnj9/viksLDQdO3Y0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sH75y1/q4MGDuvrqq1VRUdFkQWdLUlJSVFpa2uz0CFrHexca3rfQ8d6FjvcudLx3oYuF985h2uobAQAACBBnhQAAAMsQLAAAgGUIFgAAwDIECwAAYBmCBQAAsExEg8VLL72kXr16KTU1VUOHDtWmTZsi+fK29cknn6ioqEg9evSQw+HQu+++G+2SbKG8vFzXXnut0tPT1a1bN91+++366quvol2WLcybN08DBgzw7d43bNgwrVixItpl2dIzzzwjh8Ohxx57LNqlxLynnnpKDofD76tv377RLss29u/fr8mTJyszM1MdO3bUVVddpc2bN0e8jogFiz/96U+aNWuWSktLVVlZqYEDB+rWW29VbW1tpEqwrfr6eg0cOFAvvfRStEuxlXXr1qmkpEQbN27URx99pL///e8aM2aM6uvro11azLvkkkv0zDPPaMuWLdq8ebNuueUW3Xbbbfryyy+jXZqtfP7553rllVc0YMCAaJdiG/369VNNTY3v69NPP412SbZw/PhxjRgxQu3bt9eKFSu0fft2/cd//Ic6d+4c+WJMhAwZMsSUlJT4vne73aZHjx6mvLw8UiXEBUlm2bJl0S7Dlmpra40ks27dumiXYkudO3c2v//976Ndhm2cOHHCXHbZZeajjz4yN954o5k5c2a0S4p5paWlZuDAgdEuw5aefPJJc91110W7DGOMMREZsThz5oy2bNmiUaNG+a4lJSVp1KhR2rBhQyRKAORyuSRJXbp0iXIl9uJ2u7VkyRLV19dzJlAQSkpKNH78eL//76FtO3fuVI8ePXTppZdq0qRJ2rt3b7RLsoX3339fgwcP1p133qlu3brpmmuu0auvvhqVWiISLI4cOSK3291k2+/u3bvr4MGDkSgBCc7j8eixxx7TiBEj1L9//2iXYwvbtm3TRRddpJSUFD3yyCNatmyZCgoKol2WLSxZskSVlZUqLy+Pdim2MnToUC1cuFAVFRWaN2+eqqurdf311+vEiRPRLi3mffPNN5o3b54uu+wyrVy5UtOmTdOMGTP0+uuvR7yWoM8KAeyopKREVVVVzNcG4YorrtDWrVvlcrn0zjvvqLi4WOvWrSNctGHfvn2aOXOmPvroI6Wmpka7HFsZN26c778HDBigoUOHKi8vT2+99ZamTp0axcpin8fj0eDBg/X0009Lkq655hpVVVXp5ZdfVnFxcURriciIRdeuXZWcnKxDhw75XT906JCys7MjUQIS2PTp0/XBBx9ozZo1uuSSS6Jdjm106NBBffr0UWFhocrLyzVw4EA999xz0S4r5m3ZskW1tbUaNGiQ2rVrp3bt2mndunV6/vnn1a5dO7nd7miXaBsXX3yxLr/8cu3atSvapcS8nJycJqH/yiuvjMpUUkSCRYcOHVRYWKiPP/7Yd83j8ejjjz9mzhZhY4zR9OnTtWzZMq1evVq9e/eOdkm25vF41NDQEO0yYt7IkSO1bds2bd261fc1ePBgTZo0SVu3blVycnK0S7SNkydPavfu3crJyYl2KTFvxIgRTdrpv/76a+Xl5UW8lohNhcyaNUvFxcUaPHiwhgwZorlz56q+vl733XdfpEqwrZMnT/ol9urqam3dulVdunRRz549o1hZbCspKdHixYv13nvvKT093beex+l0qmPHjlGuLrbNnj1b48aNU8+ePXXixAktXrxYa9eu1cqVK6NdWsxLT09vso4nLS1NmZmZrO9pwxNPPKGioiLl5eXpwIEDKi0tVXJysu6+++5olxbzHn/8cQ0fPlxPP/20Jk6cqE2bNmn+/PmaP39+5IuJZAvKCy+8YHr27Gk6dOhghgwZYjZu3BjJl7etNWvWGElNvoqLi6NdWkxr7j2TZBYsWBDt0mLe/fffb/Ly8kyHDh1MVlaWGTlypPnzn/8c7bJsi3bTwNx1110mJyfHdOjQwfzgBz8wd911l9m1a1e0y7KN5cuXm/79+5uUlBTTt29fM3/+/KjU4TDGmMjHGQAAEI84KwQAAFiGYAEAACxDsAAAAJYhWAAAAMsQLAAAgGUIFgAAwDIECwAAYBmCBQAAsAzBAgAAWIZgAQAALEOwAAAAlvk/aNhDtFe4TqMAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Plot the data\n",
    "plot_range = (0, 2 * np.pi)\n",
    "\n",
    "for k, v in training_input.items():\n",
    "    plt.scatter(*v.T, label=str(k))\n",
    "plt.legend()\n",
    "plt.title(\"training data\")\n",
    "plt.xlim(plot_range)\n",
    "plt.ylim(plot_range)\n",
    "plt.show()\n",
    "\n",
    "for k, v in test_input.items():\n",
    "    plt.scatter(*v.T, label=str(k))\n",
    "plt.legend()\n",
    "plt.title(\"test data\")\n",
    "plt.xlim(plot_range)\n",
    "plt.ylim(plot_range)\n",
    "plt.show()\n",
    "\n",
    "plt.scatter(*predict_input.T)\n",
    "plt.title(\"predict data (unlabeled)\")\n",
    "plt.xlim(plot_range)\n",
    "plt.ylim(plot_range)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9c86cb0d-cf35-4be0-84d2-f9d871615001",
   "metadata": {},
   "source": [
    "### Define our Feature Map\n",
    "When constructing a `QSVM` model, one must supply which feature map will be used.\n",
    "\n",
    "A feature map is a way to encode classical data into quantum.\n",
    "Here, we chose to encode the data onto the surface of the bloch sphere.\n",
    "Behind the scenes, this can be translated to:\n",
    "```\n",
    "R_X(x[0] / 2)\n",
    "R_Z(x[1])\n",
    "```\n",
    "Where `x` is the 2D input vector, and the circuit takes a single qubit per data-point."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "ef5cae38-ccae-4e09-ba36-be2c6e8ed009",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-05-07T14:52:59.112850Z",
     "iopub.status.busy": "2024-05-07T14:52:59.111631Z",
     "iopub.status.idle": "2024-05-07T14:52:59.116774Z",
     "shell.execute_reply": "2024-05-07T14:52:59.116064Z"
    }
   },
   "outputs": [],
   "source": [
    "bloch_sphere_feature_map_function_name = \"bloch_sphere_feature_map\"\n",
    "bloch_sphere_kwargs = {\"bloch_feature_dimension\": 2}"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "50162836-27be-4a64-91a7-b0439fa66300",
   "metadata": {},
   "source": [
    "### Define the Data\n",
    "I addition to the feature map, we need to prepare our data.\n",
    "\n",
    "The `train_input` and `test_input` datasets consisting of data and its labels. The labels is a 1D array where the value of the label correspond to each data point and can be basically anything - such as (0, 1) , (3, 5) , or ('A', 'B').\n",
    "The `predict_input` consists only of data point (without labels).\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "517c81ac-d8f0-4624-8654-a9455d3850fc",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-05-07T14:52:59.121374Z",
     "iopub.status.busy": "2024-05-07T14:52:59.120205Z",
     "iopub.status.idle": "2024-05-07T14:52:59.125878Z",
     "shell.execute_reply": "2024-05-07T14:52:59.124862Z"
    }
   },
   "outputs": [],
   "source": [
    "# Prepare and define `train_input` and `test_input` datasets consisting of data and labels\n",
    "TRAIN_DATA, TRAIN_LABEL = data_dict_to_data_and_labels(training_input)\n",
    "TEST_DATA, TEST_LABEL = data_dict_to_data_and_labels(test_input)\n",
    "\n",
    "# Prepare and define `predict_input`\n",
    "PREDICT_DATA = predict_input"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1a8410eb-61f8-4934-afd6-64b1d341593f",
   "metadata": {},
   "source": [
    "### Construct a model\n",
    "We can now construct the QSVM model using the `construct_qsvm_model` function:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "ace245c5-58d5-437c-9809-8c5ef9f30fd7",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-05-07T14:52:59.134293Z",
     "iopub.status.busy": "2024-05-07T14:52:59.129887Z",
     "iopub.status.idle": "2024-05-07T14:52:59.142304Z",
     "shell.execute_reply": "2024-05-07T14:52:59.141382Z"
    }
   },
   "outputs": [],
   "source": [
    "QSVM_BLOCH_SHPERE = construct_qsvm_model(\n",
    "    train_data=TRAIN_DATA.tolist(),\n",
    "    train_labels=TRAIN_LABEL.tolist(),\n",
    "    test_data=TEST_DATA.tolist(),\n",
    "    test_labels=TEST_LABEL.tolist(),\n",
    "    predict_data=PREDICT_DATA.tolist(),\n",
    "    feature_map_function_name=bloch_sphere_feature_map_function_name,\n",
    "    **bloch_sphere_kwargs\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "d9497b62-577d-4d27-bcdb-1be89bad4546",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-05-07T14:52:59.147240Z",
     "iopub.status.busy": "2024-05-07T14:52:59.146014Z",
     "iopub.status.idle": "2024-05-07T14:52:59.154316Z",
     "shell.execute_reply": "2024-05-07T14:52:59.153638Z"
    }
   },
   "outputs": [],
   "source": [
    "from classiq import write_qmod\n",
    "\n",
    "write_qmod(QSVM_BLOCH_SHPERE, \"qsvm\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b29d8f67",
   "metadata": {},
   "source": [
    "### Synthesize our model and explore the generated quantum circuit\n",
    "Once we constructed our qsvm model - we synthesize and view the quantum circuit that encodes our data.\n",
    "For this we will use `classiq` built-in `synthesize` and `show` functions:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "c9cdefbe",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-05-07T14:52:59.158994Z",
     "iopub.status.busy": "2024-05-07T14:52:59.157843Z",
     "iopub.status.idle": "2024-05-07T14:53:00.762109Z",
     "shell.execute_reply": "2024-05-07T14:53:00.761400Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Opening: https://platform.classiq.io/circuit/9ef21bd7-bab7-4fd0-9e12-94f1cadce438?version=0.41.0.dev39%2B79c8fd0855\n"
     ]
    }
   ],
   "source": [
    "qprog = synthesize(QSVM_BLOCH_SHPERE)\n",
    "show(qprog)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9106df09",
   "metadata": {},
   "source": [
    "### Execute QSVM\n",
    "The first step in QSVM is the training.\n",
    "The second step in QSVM is to test the training process.\n",
    "The last QSVM step, which may be applied multiple times on different datasets, is prediction: the prediction process takes unlabeled data, and returns its predicted labels.\n",
    "\n",
    "Executing QSVM is done though the `execute` function.\n",
    "The execution results will include the accuracy of the classification and the predicted labels for the predict data.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "48f3a4bd",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-05-07T14:53:00.765710Z",
     "iopub.status.busy": "2024-05-07T14:53:00.764989Z",
     "iopub.status.idle": "2024-05-07T14:53:26.532986Z",
     "shell.execute_reply": "2024-05-07T14:53:26.532203Z"
    }
   },
   "outputs": [],
   "source": [
    "results = execute(qprog).result()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "519d20e6",
   "metadata": {},
   "source": [
    "We can view the classification accuracy through `test_score`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "6d4b68fc",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-05-07T14:53:26.538488Z",
     "iopub.status.busy": "2024-05-07T14:53:26.537280Z",
     "iopub.status.idle": "2024-05-07T14:53:26.545915Z",
     "shell.execute_reply": "2024-05-07T14:53:26.545243Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1.0"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "results[0].value[\"test_score\"]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "87b7a490-1d80-4c5f-8a59-d227fe8be03c",
   "metadata": {},
   "source": [
    "Since this data was previously generated, we also know the real labels, and can print them for comparison."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "a0c29c77-fa68-4d74-87ae-10a40af9af31",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-05-07T14:53:26.550652Z",
     "iopub.status.busy": "2024-05-07T14:53:26.549464Z",
     "iopub.status.idle": "2024-05-07T14:53:26.556522Z",
     "shell.execute_reply": "2024-05-07T14:53:26.555842Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]\n",
      "[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n",
      " 1 1 1]\n"
     ]
    }
   ],
   "source": [
    "predicted_labels = results[0].value[\"predicted_labels\"]\n",
    "print(predicted_labels)\n",
    "print(predict_real_labels)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "39880a1f",
   "metadata": {},
   "source": [
    "We can even visualize the predicted results:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "00db178e-4d49-4e55-8144-ba424b3fe833",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-05-07T14:53:26.561228Z",
     "iopub.status.busy": "2024-05-07T14:53:26.560017Z",
     "iopub.status.idle": "2024-05-07T14:53:26.783323Z",
     "shell.execute_reply": "2024-05-07T14:53:26.782600Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhYAAAGzCAYAAABzfl4TAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuNSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/xnp5ZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA/cklEQVR4nO3dd3hUdd7+8fvMhISWhN5D6NKLgPwAlWpBVkVXUUFFVt1Fg4is+yiuLrI+Glwbusui6C62pSiPYEVEqg2liAs2qvQuJCFAIDPn98eXJIRkJjPhTEver+uaK5kzZ+Z8mABz51st27ZtAQAAOMAV6QIAAEDZQbAAAACOIVgAAADHECwAAIBjCBYAAMAxBAsAAOAYggUAAHAMwQIAADiGYAEAABxDsACCsHTpUlmWpTlz5kS6lLCwLEuPPvpo/v1XX31VlmXpl19+iVhNZzu7xljwyy+/yLIsvfrqq5EuBXAcwQLlnmVZAd2WLl0a6VJj1owZMzR58uRIlxHVPvroo5gLSEBx4iJdABBpb7zxRqH7r7/+uhYuXFjkeJs2bfTjjz+Gs7Soc8stt+jGG29UQkJCUM+bMWOG1q9fr7Fjx4amsDLgo48+0pQpUwgXiHkEC5R7N998c6H7K1as0MKFC4sclxQzweLYsWOqXLmy46/rdrvldrsdf91IOHHihOLj4+Vy0XALOIl/UUApeL1ePf7442rUqJEqVqyoAQMGaNOmTUXO+/rrr3X55ZcrOTlZlStXVp8+ffTFF1+U+Pp5Yzlmz56thx56SPXq1VOVKlV01VVXaceOHYXO7du3r9q3b6/Vq1fr4osvVuXKlfXQQw9JknJycjRhwgS1aNFCCQkJSklJ0f/8z/8oJyen0Gvk5OTovvvuU+3atZWYmKirrrpKO3fuLFKXrzEW8+fPV58+fZSYmKikpCR1795dM2bMyK/vww8/1LZt2/K7lZo0aVLo2k7W6O/9nDVrlh5++GE1bNhQlStXVmZmpqTAfk5ZWVkaO3asmjRpooSEBNWpU0eXXHKJ1qxZk39OkyZNdNtttxW5ft++fdW3b1+f9d12222aMmWKpMJdc0AsosUCKIVJkybJ5XLp/vvvV0ZGhv72t79p+PDh+vrrr/PPWbx4sQYNGqSuXbtqwoQJcrlcmj59uvr376/PPvtMF1xwQYnXefzxx2VZlh544AHt379fkydP1sCBA7V27VpVqlQp/7xDhw5p0KBBuvHGG3XzzTerbt268nq9uuqqq/T555/r97//vdq0aaN169bpueee04YNGzRv3rz8599xxx168803NWzYMPXq1UuLFy/W4MGDA3ovXn31Vf3ud79Tu3btNH78eFWrVk3ffvutPv74Yw0bNkx//vOflZGRoZ07d+q5556TJFWtWlWSwlZjnscee0zx8fG6//77lZOTo/j4+IB/TqNGjdKcOXM0evRotW3bVocOHdLnn3+uH3/8Ueeff35QdZztD3/4g3bv3l1sFxwQc2wAhaSlpdm+/mksWbLElmS3adPGzsnJyT/+/PPP25LsdevW2bZt216v127ZsqV92WWX2V6vN/+8Y8eO2U2bNrUvueQSvzXkXadhw4Z2ZmZm/vG33nrLlmQ///zz+cf69OljS7JffPHFQq/xxhtv2C6Xy/7ss88KHX/xxRdtSfYXX3xh27Ztr1271pZk33333YXOGzZsmC3JnjBhQv6x6dOn25LsrVu32rZt20eOHLETExPtHj162MePHy/0/DP/3IMHD7ZTU1OL/DlDUWNx8t7PZs2a2ceOHStUY6A/p+TkZDstLc3vdVJTU+0RI0YUOd6nTx+7T58++fe3bt1qS7KnT5+ef8zf3zsgltAVApTCyJEjFR8fn3//oosukiRt2bJFkrR27Vpt3LhRw4YN06FDh3Tw4EEdPHhQ2dnZGjBggJYvXy6v11vidW699VYlJibm37/uuutUv359ffTRR4XOS0hI0MiRIwsde/vtt9WmTRu1bt06//oHDx5U//79JUlLliyRpPzXGjNmTKHnBzLQcuHChcrKytKDDz6oihUrFnoskKb8cNR4phEjRhRq6Qnm51StWjV9/fXX2r17d1DXBMobukKAUmjcuHGh+9WrV5ckHT58WJK0ceNGSeaDzJeMjIz85/nSsmXLQvcty1KLFi2KjHFo2LBhoaCTV8OPP/6o2rVrF/va+/fvlyRt27ZNLpdLzZs3L/T4eeed57c2Sdq8ebMkqX379iWeW5xw1Himpk2bFrm+FNjP6W9/+5tGjBihlJQUde3aVVdccYVuvfVWNWvWLKgagLKOYAGUgq+ZEbZtS1L+b7lPPfWUOnfuXOy5eeMMnHDmb+F5vF6vOnTooGeffbbY56SkpDh2/dIKd41nv0/B/JyGDh2qiy66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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Plotting\n",
    "COLORS = [\"blue\", \"orange\"]\n",
    "plt.scatter(\n",
    "    *zip(*predict_input),\n",
    "    color=np.vectorize(COLORS.__getitem__)(predicted_labels),\n",
    ")\n",
    "plt.title(\"The predicted result\")\n",
    "plt.xlim(plot_range)\n",
    "plt.ylim(plot_range)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "24a4042c-5565-4a04-92ff-ce5b48859304",
   "metadata": {},
   "source": [
    "# Putting it all together\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "caecbf5e-b48a-42e2-a5d6-31605b75dcdd",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-05-07T14:53:26.788339Z",
     "iopub.status.busy": "2024-05-07T14:53:26.787105Z",
     "iopub.status.idle": "2024-05-07T14:53:54.663186Z",
     "shell.execute_reply": "2024-05-07T14:53:54.662394Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Opening: https://platform.classiq.io/circuit/fba131b6-984c-4281-be1e-1ac0972dd5e5?version=0.41.0.dev39%2B79c8fd0855\n"
     ]
    }
   ],
   "source": [
    "# Prepare and define `train_input` and `test_input` datasets consisting of data and labels\n",
    "TRAIN_DATA, TRAIN_LABEL = data_dict_to_data_and_labels(training_input)\n",
    "TEST_DATA, TEST_LABEL = data_dict_to_data_and_labels(test_input)\n",
    "\n",
    "# Prepare and define `predict_input`\n",
    "PREDICT_DATA = predict_input\n",
    "\n",
    "QSVM_BLOCH_SHPERE = construct_qsvm_model(\n",
    "    train_data=TRAIN_DATA.tolist(),\n",
    "    train_labels=TRAIN_LABEL.tolist(),\n",
    "    test_data=TEST_DATA.tolist(),\n",
    "    test_labels=TEST_LABEL.tolist(),\n",
    "    predict_data=PREDICT_DATA.tolist(),\n",
    "    feature_map_function_name=bloch_sphere_feature_map_function_name,\n",
    "    **bloch_sphere_kwargs\n",
    ")\n",
    "\n",
    "\n",
    "qprog = synthesize(QSVM_BLOCH_SHPERE)\n",
    "show(qprog)\n",
    "\n",
    "results = execute(qprog).result()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d3601e89-ef0f-42ea-98a7-b09d79de3ed4",
   "metadata": {},
   "source": [
    "We may access the results of the different steps using:\n",
    "- `test` results: `results[0][1]['test_score']`\n",
    "- `predict` results: `results[0][1]['predicted_labels']`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "617e1dc4-9d49-4ecf-8bdd-b542fdcdd91a",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-05-07T14:53:54.667760Z",
     "iopub.status.busy": "2024-05-07T14:53:54.667065Z",
     "iopub.status.idle": "2024-05-07T14:53:54.674283Z",
     "shell.execute_reply": "2024-05-07T14:53:54.673572Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1.0\n",
      "\n",
      "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]\n",
      "[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n",
      " 1 1 1]\n"
     ]
    }
   ],
   "source": [
    "accuracy = results[0].value[\"test_score\"]\n",
    "print(accuracy)\n",
    "print()\n",
    "\n",
    "predicted_labels = results[0].value[\"predicted_labels\"]\n",
    "print(predicted_labels)\n",
    "print(predict_real_labels)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.9"
  },
  "vscode": {
   "interpreter": {
    "hash": "a07aacdcc8a415e7643a2bc993226848ff70704ebef014f87460de9126b773d0"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
